home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
wink24
/
src
/
vram.asm
< prev
next >
Wrap
Assembly Source File
|
1993-07-08
|
14KB
|
661 lines
.386p
extrn MAX_SCR:DWORD
extrn ReWrt_flg:WORD
extrn dmy_vram:DWORD
extrn locate:NEAR
;*****************************************************************
;
;void wrtank(ch,x,y,ccol,bcol,off)
;
;void wrtkanji(ch,x,y,ccol,bcol,off)
;
;*****************************************************************
v_para struc
v_ebp dd ?
v_pcr dd ?
v_ch dd ?
v_x dd ?
v_y dd ?
v_ccol dd ?
v_bcol dd ?
v_off dd ?
v_para ends
;*************************************
; VRAM Direct Access Program
;*************************************
bitptn segment 'DATA'
colptn:
dd 000000000h,099999999h,0AAAAAAAAh,0BBBBBBBBh
dd 0CCCCCCCCh,0DDDDDDDDh,0EEEEEEEEh,0FFFFFFFFh
dd 088888888h,011111111h,022222222h,033333333h
dd 044444444h,055555555h,066666666h,077777777h
fntptn:
dd 000000000h,0F0000000h,00F000000h,0FF000000h
dd 000F00000h,0F0F00000h,00FF00000h,0FFF00000h
dd 0000F0000h,0F00F0000h,00F0F0000h,0FF0F0000h
dd 000FF0000h,0F0FF0000h,00FFF0000h,0FFFF0000h
dd 00000F000h,0F000F000h,00F00F000h,0FF00F000h
dd 000F0F000h,0F0F0F000h,00FF0F000h,0FFF0F000h
dd 0000FF000h,0F00FF000h,00F0FF000h,0FF0FF000h
dd 000FFF000h,0F0FFF000h,00FFFF000h,0FFFFF000h
dd 000000F00h,0F0000F00h,00F000F00h,0FF000F00h
dd 000F00F00h,0F0F00F00h,00FF00F00h,0FFF00F00h
dd 0000F0F00h,0F00F0F00h,00F0F0F00h,0FF0F0F00h
dd 000FF0F00h,0F0FF0F00h,00FFF0F00h,0FFFF0F00h
dd 00000FF00h,0F000FF00h,00F00FF00h,0FF00FF00h
dd 000F0FF00h,0F0F0FF00h,00FF0FF00h,0FFF0FF00h
dd 0000FFF00h,0F00FFF00h,00F0FFF00h,0FF0FFF00h
dd 000FFFF00h,0F0FFFF00h,00FFFFF00h,0FFFFFF00h
dd 0000000F0h,0F00000F0h,00F0000F0h,0FF0000F0h
dd 000F000F0h,0F0F000F0h,00FF000F0h,0FFF000F0h
dd 0000F00F0h,0F00F00F0h,00F0F00F0h,0FF0F00F0h
dd 000FF00F0h,0F0FF00F0h,00FFF00F0h,0FFFF00F0h
dd 00000F0F0h,0F000F0F0h,00F00F0F0h,0FF00F0F0h
dd 000F0F0F0h,0F0F0F0F0h,00FF0F0F0h,0FFF0F0F0h
dd 0000FF0F0h,0F00FF0F0h,00F0FF0F0h,0FF0FF0F0h
dd 000FFF0F0h,0F0FFF0F0h,00FFFF0F0h,0FFFFF0F0h
dd 000000FF0h,0F0000FF0h,00F000FF0h,0FF000FF0h
dd 000F00FF0h,0F0F00FF0h,00FF00FF0h,0FFF00FF0h
dd 0000F0FF0h,0F00F0FF0h,00F0F0FF0h,0FF0F0FF0h
dd 000FF0FF0h,0F0FF0FF0h,00FFF0FF0h,0FFFF0FF0h
dd 00000FFF0h,0F000FFF0h,00F00FFF0h,0FF00FFF0h
dd 000F0FFF0h,0F0F0FFF0h,00FF0FFF0h,0FFF0FFF0h
dd 0000FFFF0h,0F00FFFF0h,00F0FFFF0h,0FF0FFFF0h
dd 000FFFFF0h,0F0FFFFF0h,00FFFFFF0h,0FFFFFFF0h
dd 00000000Fh,0F000000Fh,00F00000Fh,0FF00000Fh
dd 000F0000Fh,0F0F0000Fh,00FF0000Fh,0FFF0000Fh
dd 0000F000Fh,0F00F000Fh,00F0F000Fh,0FF0F000Fh
dd 000FF000Fh,0F0FF000Fh,00FFF000Fh,0FFFF000Fh
dd 00000F00Fh,0F000F00Fh,00F00F00Fh,0FF00F00Fh
dd 000F0F00Fh,0F0F0F00Fh,00FF0F00Fh,0FFF0F00Fh
dd 0000FF00Fh,0F00FF00Fh,00F0FF00Fh,0FF0FF00Fh
dd 000FFF00Fh,0F0FFF00Fh,00FFFF00Fh,0FFFFF00Fh
dd 000000F0Fh,0F0000F0Fh,00F000F0Fh,0FF000F0Fh
dd 000F00F0Fh,0F0F00F0Fh,00FF00F0Fh,0FFF00F0Fh
dd 0000F0F0Fh,0F00F0F0Fh,00F0F0F0Fh,0FF0F0F0Fh
dd 000FF0F0Fh,0F0FF0F0Fh,00FFF0F0Fh,0FFFF0F0Fh
dd 00000FF0Fh,0F000FF0Fh,00F00FF0Fh,0FF00FF0Fh
dd 000F0FF0Fh,0F0F0FF0Fh,00FF0FF0Fh,0FFF0FF0Fh
dd 0000FFF0Fh,0F00FFF0Fh,00F0FFF0Fh,0FF0FFF0Fh
dd 000FFFF0Fh,0F0FFFF0Fh,00FFFFF0Fh,0FFFFFF0Fh
dd 0000000FFh,0F00000FFh,00F0000FFh,0FF0000FFh
dd 000F000FFh,0F0F000FFh,00FF000FFh,0FFF000FFh
dd 0000F00FFh,0F00F00FFh,00F0F00FFh,0FF0F00FFh
dd 000FF00FFh,0F0FF00FFh,00FFF00FFh,0FFFF00FFh
dd 00000F0FFh,0F000F0FFh,00F00F0FFh,0FF00F0FFh
dd 000F0F0FFh,0F0F0F0FFh,00FF0F0FFh,0FFF0F0FFh
dd 0000FF0FFh,0F00FF0FFh,00F0FF0FFh,0FF0FF0FFh
dd 000FFF0FFh,0F0FFF0FFh,00FFFF0FFh,0FFFFF0FFh
dd 000000FFFh,0F0000FFFh,00F000FFFh,0FF000FFFh
dd 000F00FFFh,0F0F00FFFh,00FF00FFFh,0FFF00FFFh
dd 0000F0FFFh,0F00F0FFFh,00F0F0FFFh,0FF0F0FFFh
dd 000FF0FFFh,0F0FF0FFFh,00FFF0FFFh,0FFFF0FFFh
dd 00000FFFFh,0F000FFFFh,00F00FFFFh,0FF00FFFFh
dd 000F0FFFFh,0F0F0FFFFh,00FF0FFFFh,0FFF0FFFFh
dd 0000FFFFFh,0F00FFFFFh,00F0FFFFFh,0FF0FFFFFh
dd 000FFFFFFh,0F0FFFFFFh,00FFFFFFFh,0FFFFFFFFh
bitptn ends
VRAM segment 'CODE'
assume cs:VRAM
;**************************************
; Write Kanji Code (JIS or SJIS)
;**************************************
public wrtkan
wrtkan proc near
push ebp
mov ebp,esp
push esi
push edi
push ebx
push ds
push fs
mov edi,[ebp].v_y
shl edi,13 ; 128 * 4 * 16 * v_y = 8192 * v_x
mov eax,[ebp].v_x
shl eax,2 ; v_x * 4
add edi,eax
and edi,03FFFFh
add edi,[ebp].v_off
mov eax,[ebp].v_ccol
and eax,0fh
mov eax,ds:[eax*4+offset colptn]
mov [ebp].v_ccol,eax
mov eax,[ebp].v_bcol
and eax,0fh
mov eax,ds:[eax*4+offset colptn]
mov [ebp].v_bcol,eax
mov ebx,[ebp].v_ch
bt ebx,15
jnc sjto4
shl bh,1 ; Shift Jis to Jis
cmp bl,080h
adc bx,1f61h
add bl,7fh
jc knf1
add bl,0a2h
knf1: and bh,7fh ; StoJ end
sjto4: push es
mov ax,0110h
mov fs,ax
mov ax,0100h
mov dx,1010h
call pword ptr fs:[00a0h]
pop es
mov eax,104h
mov fs,ax
mov ecx,16
wrtkn1: movzx eax,byte ptr ds:[esi]
inc esi
mov eax,es:[eax*4+offset fntptn]
mov ebx,eax
not ebx
and eax,[ebp].v_ccol
and ebx,[ebp].v_bcol
or eax,ebx
mov fs:[edi],eax
movzx eax,byte ptr ds:[esi]
inc esi
mov eax,es:[eax*4+offset fntptn]
mov ebx,eax
not ebx
and eax,[ebp].v_ccol
and ebx,[ebp].v_bcol
or eax,ebx
mov fs:[edi+4],eax
add edi,512
and edi,03FFFFh
add edi,[ebp].v_off
loop wrtkn1
pop fs
pop ds
pop ebx
pop edi
pop esi
pop ebp
ret
wrtkan endp
;***********************************
; Write ANK code
;***********************************
public wrtank
wrtank proc near
push ebp
mov ebp,esp
push esi
push edi
push ebx
push es
push fs
mov edi,[ebp].v_y
shl edi,13
mov eax,[ebp].v_x
shl eax,2
add edi,eax
and edi,03FFFFh
add edi,[ebp].v_off
mov eax,[ebp].v_ccol
and eax,0fh
mov eax,ds:[eax*4+offset colptn]
mov [ebp].v_ccol,eax
mov eax,[ebp].v_bcol
and eax,0fh
mov eax,ds:[eax*4+offset colptn]
mov [ebp].v_bcol,eax
mov ax,138h
mov es,ax
mov ax,104h
mov fs,ax
mov esi,[ebp].v_ch
and esi,0ffh
shl esi,4
add esi,3D800h
mov ecx,16
wrtak2: movzx eax,byte ptr es:[esi]
inc esi
mov eax,ds:[eax*4+offset fntptn]
mov ebx,eax
not ebx
and eax,[ebp].v_ccol
and ebx,[ebp].v_bcol
or eax,ebx
mov fs:[edi],eax
add edi,512
and edi,03FFFFh
add edi,[ebp].v_off
loop wrtak2
pop fs
pop es
pop ebx
pop edi
pop esi
pop ebp
ret
wrtank endp
;***********************************
;* VRAM Scrool
;***********************************
public vramroll
vramroll proc near
push esi
push edi
push ds
push es
mov eax,104h
mov es,ax
mov ds,ax
mov esi,512*16
mov edi,0
cld
mov ax,16*24
vramlp: mov ecx,512/4
rep movsd
dec ax
jnz vramlp
mov ecx,512*16/4
mov eax,0
rep stosd
pop es
pop ds
pop edi
pop esi
ret
vramroll endp
;********************************
;* VRAM Clraer
;********************************
public vramcls
vramcls proc near
push ebp
mov ebp,esp
push edx
push esi
push edi
push ds
push es
mov edi,[ebp+8]
shl edi,13
and edi,03ffffh
add edi,[ebp+16]
cld
mov eax,[ebp+12]
and eax,0fh
mov eax,ds:[eax*4+offset colptn]
mov dx,104h
mov es,dx
mov ds,dx
mov dx,16
vramcl: mov ecx,512/4
rep stosd
and edi,03ffffh
add edi,[ebp+16]
dec dx
jnz vramcl
pop es
pop ds
pop edi
pop esi
pop edx
pop ebp
ret
vramcls endp
;***********************************
; Displry CurSol
;***********************************
public disp_cur
disp_cur proc near
push ebp
mov ebp,esp
push edi
push ds
mov edi,[ebp+12]
shl edi,13
mov eax,[ebp+8]
shl eax,2
add edi,eax
and edi,03FFFFh
add edi,[ebp+16]
mov eax,104h
mov ds,ax
mov ecx,16
disp_1: not dword ptr ds:[edi]
add edi,512
and edi,03FFFFh
add edi,[ebp+16]
loop disp_1
pop ds
pop edi
pop ebp
ret
disp_cur endp
;***********************************
; Displry CurSol
;***********************************
public colset
colset proc near
push ebp
mov ebp,esp
push edi
cld
mov edi,[ebp+8]
mov eax,[ebp+12]
mov ecx,[ebp+16]
shr ecx,1
rep stosw
pop edi
pop ebp
ret
colset endp
;***********************************
; Soft Timer
;***********************************
public Soft_Timer
Soft_Timer proc near
mov cx,[esp+4]
int 0FDh
ret
Soft_Timer endp
;***********************************
; Printer BIOS
;***********************************
public PRB_chr
PRB_chr proc near
mov ax,0100h
mov dl,[esp+4]
int 94h
mov al,ah
and eax,0FFh
ret
PRB_chr endp
;**********************************************
; 漢字コ-ドチェックテ-ブル
;**********************************************
ISKAN1 equ 1
ISKAN2 equ 2
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
kantbl db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;2
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;3
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;4
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;5
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;6
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0 ;7
db 2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;8
db 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;9
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;A
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;B
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;C
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;D
db 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;E
db 3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0 ;F
;**************************************************
;void wrtstr(char *str, int x, int y, int cl)
; +8 +12 +16 +20
;**************************************************
public wrtstr
wrtstr proc near
push ebp
mov ebp,esp
sub esp,8
push ebx
push esi
push edi
mov eax,[ebp+20]
test al,16
je BakCol
and eax,15
mov [ebp-8],eax ; bc
mov dword ptr [ebp-4],0 ; fc
jmp WrtSt1
BakCol: and eax,0Fh
mov [ebp-4],eax ; fc
mov dword ptr [ebp-8],0 ; bc
WrtSt1: mov eax,[ebp+12] ; x
lea edi,[eax+eax]
mov eax,[ebp+16] ; y
lea eax,[eax+eax*4]
shl eax,5
add edi,eax
add edi,[dmy_vram]
mov esi,[ebp+8] ; *str
WrtStLp:
movzx eax,byte ptr [esi]
inc esi
and al,al
jnz WrtSt2
pop edi
pop esi
pop ebx
leave
ret
WrtSt2:
mov bl,[eax+offset kantbl]
and bl,ISKAN1
jz NonKan
movzx ebx,byte ptr [esi]
mov bh,[ebx+offset kantbl]
and bh,ISKAN2
jz NonKan
mov bh,al
inc si
push 0
push dword ptr [ebp-8]
push dword ptr [ebp-4]
push dword ptr [ebp+16]
push dword ptr [ebp+12]
push ebx
call wrtkan
add esp,6*4
mov al,[ebp+20]
or al,40h
mov ah,bh
mov [edi],ax
add edi,2
mov al,[ebp+20]
or al,80h
mov ah,bl
mov [edi],ax
add edi,2
add dword ptr [ebp+12],2
jmp WrtStNt
NonKan:
cmp al,1Bh
je WrtStNt
mov ebx,eax
push 0
push dword ptr [ebp-8]
push dword ptr [ebp-4]
push dword ptr [ebp+16]
push dword ptr [ebp+12]
push ebx
call wrtank
add esp,6*4
mov al,[ebp+20]
mov ah,bl
mov [edi],ax
add edi,2
inc dword ptr [ebp+12]
WrtStNt:
cmp dword ptr [ebp+12],80
jl WrtStLp
inc dword ptr [ebp+16]
mov dword ptr [ebp+12],0
jmp WrtStLp
wrtstr endp
;******************************************
;void Dsp_vram(char *vp)
; +8
;******************************************
public Dsp_vram
Dsp_vram proc near
push ebp
mov ebp,esp
sub esp,16
push ebx
push esi
push edi
mov edi,[dmy_vram]
add edi,320
mov esi,[ebp+8]
mov dword ptr [ebp-4],0 ; y = 0
DspYLop:
mov ecx,0
DspXLop:
mov ax,[esi] ; *vp
cmp ax,[edi] ; *mp
je DspXNxt
cmp ecx,0
je DspNxt1
test al,80h
jz DspNxt1
mov bx,[esi-2]
test bl,40h
jz DspNxt1
dec ecx
sub esi,2
sub edi,2
DspNxt1:
movzx eax,byte ptr [esi]
test al,10h
je DspNxt2
and al,0Fh
mov [ebp-16],eax
mov dword ptr [ebp-12],0
jmp DspNxt3
DspNxt2:
and al,0Fh
mov [ebp-12],eax
mov dword ptr [ebp-16],0
DspNxt3:
mov eax,[esi]
and eax,00800040h
cmp eax,00800040h
jne DspNxt4
push ecx
push 0
push dword ptr [ebp-16]
push dword ptr [ebp-12]
mov eax,[ebp-4]
add eax,2
push eax
push ecx
movzx eax,byte ptr [esi+3]
mov ah,byte ptr [esi+1]
push eax
call wrtkan
add esp,6*4
pop ecx
mov eax,[esi]
mov [edi],eax
jmp DspXNxt
DspNxt4:
push ecx
push 0
push dword ptr [ebp-16]
push dword ptr [ebp-12]
mov eax,[ebp-4]
add eax,2
push eax
push ecx
mov al,[esi]
and al,0C0h
jz DspNxt5
mov eax,0FEh
jmp DspNxt6
DspNxt5:
movzx eax,byte ptr [esi+1]
DspNxt6:
push eax
call wrtank
add esp,6*4
pop ecx
mov ax,[esi]
mov [edi],ax
DspXNxt:
add esi,2
add edi,2
inc ecx
cmp ecx,80
jne DspXLop
inc dword ptr [ebp-4]
mov eax,[ebp-4]
cmp eax,MAX_SCR
jne DspYLop
mov word ptr ReWrt_flg,-1
call locate
pop edi
pop esi
pop ebx
leave
ret
Dsp_vram endp
VRAM ends
end